/**
 * 文件名：@AfwContext.java <br/>
 * 包名：cn.efunbox.afw.core <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core;

import java.util.HashMap;
import java.util.Map;

import org.springframework.context.ApplicationContext;

import cn.efunbox.afw.core.mvc.context.Context;

/**
 * 类名：AfwContext  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2015年12月2日 下午6:46:11  <br />
 * @version 2015年12月2日
 */
public class AfwContext {

	// 上下文对象在存储时，使用的key
	private static final String CONTEXT_KEY = "CONTEXT_KEY";
	
	// spring上下文
	private static ApplicationContext applicationContext;
	
	// 用于缓存线程变量
	private static final ThreadLocal<Map<String, Object>> CACHE = new ThreadLocal<Map<String, Object>>();
	
	/**
	 * 
	 * 功能：保存上下文对象 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午6:48:54 <br/>
	 */
	public static void setContext(Context context) {
		setValue(CONTEXT_KEY, context);
	}
	
	
	/**
	 * 
	 * 功能：取得当前线程中的上下文对象 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午6:49:15 <br/>
	 */
	public static Context getContext() {
		return getValue(CONTEXT_KEY);
	}
	
	/**
	 * 
	 * 功能：在当前线程上下文中保存变量 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午6:49:36 <br/>
	 */
	public static void setValue(String key, Object value) {
		Map<String, Object> map = CACHE.get();
		if (null == map) {
			CACHE.set(map = new HashMap<String, Object>());
		}
		
		map.put(key, value);
	}
	
	/**
	 * 
	 * 功能：功能：获得当前线程中给定key对应的value <br/>
	 * 
	 * 		注意：这里只有在实际类型匹配时，才能实现自动转换
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午6:50:02 <br/>
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getValue(String key) {
		Map<String, Object> map = CACHE.get();
		
		if (null != map && ! map.isEmpty()) {
			return (T) map.get(key);
		}
		
		return null;
	}
	
	/**
	 * 
	 * 功能：删除指定key的参数 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午6:50:13 <br/>
	 */
	public static void remove(String key) {
		Map<String, Object> map = CACHE.get();
		
		if (null != map && ! map.isEmpty()) {
			map.remove(key);
		}
	}

	/**
	 * 
	 * 功能：清空当前线程的数据缓存 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午6:50:36 <br/>
	 */
	public static void clear() {
		//CACHE.set(null);
		CACHE.remove();
	}

	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午6:50:51 <br/>
	 */
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}

	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午6:50:56 <br/>
	 */
	public static void setApplicationContext(ApplicationContext applicationContext) {
		AfwContext.applicationContext = applicationContext;
	}
}
